package com.kexio.security.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kexio.security.domain.Role;

/**
 * 角色Mapper接口
 * 
 * @author kexio
 */
@Mapper
public interface RoleMapper extends BaseMapper<Role> {

    /**
     * 根据角色代码查询角色
     */
    Role selectByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据角色代码查询角色（别名方法）
     */
    default Role findByRoleCode(String roleCode) {
        return selectByRoleCode(roleCode);
    }

    /**
     * 根据角色名称查询角色
     */
    Role selectByRoleName(@Param("roleName") String roleName);

    /**
     * 根据角色名称查询角色（别名方法）
     */
    default Role findByRoleName(String roleName) {
        return selectByRoleName(roleName);
    }

    /**
     * 统计角色代码数量（排除指定ID）
     */
    int countByRoleCode(@Param("roleCode") String roleCode, @Param("excludeId") Long excludeId);

    /**
     * 统计角色名称数量（排除指定ID）
     */
    int countByRoleName(@Param("roleName") String roleName, @Param("excludeId") Long excludeId);

    /**
     * 分页查询角色
     */
    Page<Role> selectRolePage(Page<Role> page, @Param("roleName") String roleName, @Param("status") Integer status);

    /**
     * 根据状态查询角色列表
     */
    List<Role> selectByStatus(@Param("status") Integer status);

    /**
     * 根据角色类型查询角色列表
     */
    List<Role> selectByRoleType(@Param("roleType") Integer roleType);

    /**
     * 根据用户ID查询角色列表
     */
    List<Role> selectByUserId(@Param("userId") Long userId);

    /**
     * 获取用户的所有角色代码
     */
    List<String> selectRoleCodesByUserId(@Param("userId") Long userId);

    /**
     * 批量删除角色
     */
    int deleteByIds(@Param("ids") List<Long> ids);

    /**
     * 批量插入角色
     */
    int insertBatch(@Param("roles") List<Role> roles);

    /**
     * 更新角色状态
     */
    int updateStatus(@Param("roleId") Long roleId, @Param("status") Integer status);

    /**
     * 获取角色统计信息
     */
    int selectTotalCount();

    /**
     * 获取启用角色数量
     */
    int selectEnabledCount();

    /**
     * 检查角色是否被使用
     */
    int checkRoleInUse(@Param("roleId") Long roleId);

    /**
     * 获取角色权限列表
     */
    List<String> selectPermissionsByRoleId(@Param("roleId") Long roleId);

    /**
     * 清空角色权限
     */
    int clearRolePermissions(@Param("roleId") Long roleId);

    /**
     * 批量添加角色权限
     */
    int insertRolePermissions(@Param("roleId") Long roleId, @Param("permissionIds") List<Long> permissionIds);
}